/**
 * 
 */
package algorithme;

import java.util.ArrayList;
import java.util.HashMap;

import programme.Portefeuille;
import programme.PortefeuilleDeterministe;
import programme.Solution;
import programme.Variable;
import programme.VecteurVariables;

/**
 * @author port
 *
 */
public class Glouton_PF<T> extends Glouton<Portefeuille> {
	
	PortefeuilleDeterministe pd;
	
	public Glouton_PF(Portefeuille p){
		prog = p;
		pd = (PortefeuilleDeterministe)p;
	}
	
	public Solution lancer() {
		
		ArrayList<Variable> variables = new ArrayList<Variable>();
		
		for (VecteurVariables vv : pd.getVecteursVariables().values()){
			variables.addAll(vv.getVariables());
		}
		
		Solution solution = new Solution(variables);
		
		ArrayList<Variable> S = new ArrayList<Variable>();
		HashMap<Variable, Variable> Schoix = new HashMap<Variable, Variable>();
		
		Variable var;
		ArrayList<Variable> titres = pd.getTitres();
		ArrayList<Variable> choix = pd.getChoix();
		
		int i = 0;
		int indice;
		
		//System.out.println("\tDebut Glouton_PF.lancer()");
		
		while(!pd.satisfaitContraintes(solution)){
			
			solution.raz();
			
			// on tire un ensemble S de K titres
			for (int j = 0; j < pd.getK(); j++){
				do{
					indice = (int)(Math.random() * titres.size());
					var = titres.get(indice);
				}while (S.contains(var));
				
				S.add(var);
				Schoix.put(var, choix.get(indice));
			}
			
			
			double somme = 0.0;
			
			// pour tout x de S
			for (Variable x : S){
				
				double secondMembre = 1;
				
				for (Variable xj : S){
					
					if (!xj.equals(x)){
						// System.out.println("Pas le meme");
						secondMembre -= solution.getValeurs().get(xj); 
						secondMembre -= (1.0 - solution.getValeurs().get(Schoix.get(x))) * pd.getEpsilon();
					}
					
					else{
						// System.out.println("Le Meme");
						//secondMembre += solution.getValeurs().get(x);
					}
				}
				
				// xi = ...
				secondMembre = Math.max(pd.getEpsilon(), Math.min(pd.getDelta(), secondMembre));
				
				if ( (somme + secondMembre) < 1){
					solution.getValeurs().put(x, secondMembre);
				}
				else{
					solution.getValeurs().put(x, 1.0 - somme);
				}
				somme += secondMembre;
				
				// yi = 1
				solution.getValeurs().put(Schoix.get(x), 1.0);
				
				i++;
				
			}
			
			somme = 0.0;
			
			i = 0;
			S.clear();
			
			// System.out.println("\t\tContraintes non satisfaites");
		}
		
		//System.out.println("\tFin lancer()");
		return solution;
		
	}
	
}
